package com.gosling.gosling.hutool;

import cn.hutool.cache.Cache;
import cn.hutool.cache.CacheUtil;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.lang.Validator;
import cn.hutool.core.util.IdcardUtil;
import com.github.rholder.retry.*;
import com.google.common.base.Preconditions;
import com.gosling.cloudspace.common.exception.CommonException;
import org.apache.commons.lang3.StringUtils;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.test.context.SpringBootTest;

import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;

/**
 * @Software: IntelliJ IDEA
 * @Addresses: www.gosling.com
 * @Email 1793327033@qq.com
 * @Classname lhltest
 * @Author: lihonglin
 * @Date: 2021/8/8 17:36
 */
@SuppressWarnings("all")
@SpringBootTest(classes = HutoolValidateTest.class)
@SpringBootApplication
public class HutoolValidateTest {


    public static String nDaysAgo(int nDays) {
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
        calendar.add(Calendar.DATE, nDays);
        return sdf1.format(calendar.getTime());
    }

    public static void main(String[] args) throws Exception {


        Object nuaa = null;
        System.out.println(String.valueOf(nuaa));

        ArrayList<String> list = new ArrayList<>();

    }

    /**
     * 去重
     *
     * @param ipString
     * @param ipString2
     * @return
     */
    private static String getIpInfo(String ipString, String ipString2) {
        List<String> ipArr = ip2List(ipString);
        List<String> ipArr2 = ip2List(ipString2);
        HashSet<String> hashSet = new HashSet(ipArr);
        hashSet.addAll(ipArr2);
        return StringUtils.join(hashSet, ",");
    }

    /***
     * 字符串转集合
     * @param ipString
     * @return
     */
    private static List<String> ip2List(String ipString) {
        if (StringUtils.isBlank(ipString)) {
            return new ArrayList<>();
        }
        String[] ips = ipString.split(",");
        return Arrays.asList(ips);
    }

    private static void kkik() {
        Cache<String, String> lfuCache = CacheUtil.newLFUCache(3);
        //通过实例化对象创建
        //LFUCache<String, String> lfuCache = new LFUCache<String, String>(3);
        lfuCache.put("key1", "value1", DateUnit.SECOND.getMillis() * 3);
        //使用次数+1
        String value1 = lfuCache.get("key1");
        lfuCache.put("key2", "value2", DateUnit.SECOND.getMillis() * 3);
        lfuCache.put("key3", "value3", DateUnit.SECOND.getMillis() * 3);
        lfuCache.put("key4", "value4", DateUnit.SECOND.getMillis() * 3);
        //由于缓存容量只有3，当加入第四个元素的时候，根据LRU规则，最少使用的将被移除（2,3被移除）
        //null
        String value2 = lfuCache.get("key2");
        //null
        String value3 = lfuCache.get("key3");
        System.out.println(value1);
        System.out.println(value2 + "-" + value3);
    }

    private static void fgf() {
        Cache<String, String> lfuCache = CacheUtil.newLFUCache(3);
        String value1 = lfuCache.get("key1");
        System.out.println(value1);
    }

    private static void 打饭() {
        String[] strings = null;
        HashSet<String> set = new HashSet<>(Arrays.asList(strings));
        String join = StringUtils.join(set, ",");
        System.out.println(join);
    }

    private static void lokj() {

        Map<String, Object> json = new HashMap<>(8);
        json.put("timestamp", "1");
        json.put("bankcard", "2222");
        json.put("realName", "safsafa");
        json.put("idNo", "1113243254325");
        //日志打印加密后的数据
        HashMap<String, Object> logPrint = new HashMap<>(8);
        logPrint.putAll(json);
        logPrint.put("bankcard", "只是");
        logPrint.put("realName", "只是");
        System.out.println("请求数盒魔方验证参数[加密后]:" + logPrint);
    }

    private static void 沙发上() {
        String s = "369992199603263333";
        char c = s.charAt(17);
        System.out.println(c);
//        Character.toLowerCase() == Character.toLowerCase(c2);
        Assert.isTrue(IdcardUtil.isValidCard("420624198808192913"), "身份证格式错误");
//        Assert.isTrue(BankCardTool.checkBankCard("6226900718586023"),"身份证格式错误");
    }

    private static void sdasf() {
        String key = "";
        String custNo = "cust";
        String platformNo = "plat";
        if (StringUtils.isNotBlank(custNo) && StringUtils.isNotBlank(platformNo)) {
            key = key + ":" + custNo + ":" + platformNo;
        } else if (StringUtils.isNotBlank(custNo)) {
            key = key + ":" + custNo;
        } else if (StringUtils.isNotBlank(platformNo)) {
            key = key + ":" + platformNo;
        }

        System.out.println(key);
    }

    private static void ygdsuya() {
        //alter table MOBAOPAY_AUDIT.MERCHANT_BATCH_ORIGIN_DATA add BAL NUMBER(16,2) default null;
        //comment on columnMOBAOPAY_AUDIT.MERCHANT_BATCH_ORIGIN_DATA.BAL is'老商户数据:账户金额';
//        Assert.isTrue(IdcardUtil.isValidCard("xxx"), tryMobaoException("身份证格式校验错误"));
//        Assert.isTrue(IdcardUtil.isValidCard("xxx"), CommonException.tryError("身份证格式校验错误"));


//        Assert.isTrue(BankCardTool.checkBankCard(""), tryMobaoException("银行卡格式错误"));
//        Assert.isTrue(BankCardTool.checkBankCard(""), tryMobaoException("银行卡格式错误"));
//        StringX = "0.02";
//        String feeRate = new BigDecimal(x).divide(new BigDecimal(100), 4, RoundingMode.HALF_UP).toString();
//        System.out.println(feeRate);
        // 统一社会信用代码（营业执照注册号）
//        Assert.isTrue(Validator.isCreditCode("9111010880116C302"),CommonException.tryError("营业执照错误"));
//        Assert.isTrue(Validator.isCreditCode("91210100604608172K"),CommonException.tryError("营业执照错误"));
//        Assert.isTrue(Validator.isCreditCode("91510100572265397R"),CommonException.tryError("营业执照错误"));
    }


    private static Supplier<CommonException> tryMobaoException(String errorMsg) {
        return () -> new CommonException(errorMsg);
    }

    public static void retrySendMessage(String phone, String message) {
        // 定义重试规则（如果需要其他更详细的规则，建议看源码）
        Retryer<Boolean> retry = RetryerBuilder.<Boolean>newBuilder()
                .retryIfException()
                // 运行时异常时
                .retryIfRuntimeException()
                // call方法返回true时重试
                .retryIfResult(ab -> Objects.equals(ab, true))
                // 10秒后重试
                .withWaitStrategy(WaitStrategies.fixedWait(10, TimeUnit.SECONDS))
                // 重试n次，超过次数就...
                .withStopStrategy(StopStrategies.stopAfterAttempt(5))
                // 可以自定义监听器
                // .withRetryListener()
                .build();

        // 调用重试任务
        try {
            retry.call(() -> {
                try {
                    send(phone, message);
                    return false;
                } catch (Exception e) {
                    System.out.println("[" + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
                            .format(LocalDateTime.now()) + "]尝试重新发送：" + e.getMessage());
                    return true;
                }
            });
        } catch (ExecutionException | RetryException e) {
            e.printStackTrace();
        }
    }

    public static void send(String phone, String message) {
        // 参数校验
        Preconditions.checkNotNull(phone, "phone不能为空！");
        Preconditions.checkNotNull(message, "message不能为空！");

        // 您老的业务代码，千言万语都在这里了，比如通过第三方平台发送短信，随便随机抛个异常
        if (LocalDateTime.now().getSecond() % 3 == 0) {
            throw new RuntimeException("不好意思，短信平台已挂");
        }
        System.out.println("[" + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
                .format(LocalDateTime.now()) + "]短信发送成功：" + phone + "->" + message);
    }

    public void huTollsValidatorTest() {
        // null 空 布尔
        Assert.isTrue(Validator.isNull(null));
        Assert.isTrue(Validator.isNotNull("test"));
        Assert.isTrue(Validator.isEmpty(""));
        Assert.isTrue(Validator.isNotEmpty("test"));
        Assert.isTrue(Validator.isTrue(true));
        Assert.isTrue(Validator.isFalse(false));
        // 相等
        Assert.isTrue(Validator.equal("test", "test"));
        // 是否汉字，包含汉字
        Assert.isTrue(Validator.hasChinese("test叨叨软件测试"));
        Assert.isTrue(Validator.isChinese("叨叨软件测试"));
        // 是否为数字
        Assert.isTrue(Validator.isNumber("1.1"));
        // 是否字母，包括大写和小写字母
        Assert.isTrue(Validator.isWord("test"));
        // 是否为英文字母 、数字和下划线， 还支持：大写和小写字母和汉字（isLetter）
        Assert.isTrue(Validator.isGeneral("dao_1"));
        // 是否全为大写或小写字母
        Assert.isTrue(Validator.isLowerCase("test"));
        Assert.isTrue(Validator.isUpperCase("test"));
        // 检查给定的数字是否在指定范围内
        Assert.isTrue(Validator.isBetween(1, 1, 1));
        // 生日
        Assert.isTrue(Validator.isBirthday("20200830"));
        // 18位 身份证号格式校验，已经提 PR，改为调用 IdcardUtil 的方法，估计5.4.1 版本更新
        Assert.isTrue(Validator.isCitizenId("11010119900307299X"));
        // 身份证校验，支持18位、15位和港澳台的10位
        // 支持：10位（isValidCard10），15位（isValidCard15），18位（isValidCard18），香港（isValidHKCard），台湾（isValidTWCard）
        Assert.isTrue(IdcardUtil.isValidCard("11010119900307299X"));
        Assert.isTrue(IdcardUtil.isValidCard18("11010119900307299X"));
        // 统一社会信用代码（营业执照注册号）
        Assert.isTrue(Validator.isCreditCode("91350500676532779B"));
        // 中国车牌号
        Assert.isTrue(Validator.isPlateNumber("京A88888"));
        // 邮编
        Assert.isTrue(Validator.isZipCode("100000"));
        // uuid
        Assert.isTrue(Validator.isUUID(UUID.randomUUID().toString()));
        // 正则表达式
        Assert.isTrue(Validator.isMatchRegex("^d.*t$", "test"));
        // 手机号
        Assert.isTrue(Validator.isMobile("13888888888"));
        // url
        Assert.isTrue(Validator.isUrl("http://www.baidu.com"));
        // email
        Assert.isTrue(Validator.isEmail("dao@test.com"));
        // ip
        Assert.isTrue(Validator.isIpv4("192.168.1.1"));
        Assert.isTrue(Validator.isIpv6("CDCD:910A:2222:5498:8475:1111:3900:2020"));
    }

    void test1() {
        retrySendMessage("18605998878", "guava");
    }
}
